package com.example.innospace.demos.pojo.result;

import com.example.innospace.demos.pojo.enums.MessageEnum;
import com.example.innospace.demos.pojo.enums.ResponseCodeEnum;
import lombok.Data;

/**
 * 通用返回结果类，服务端响应的数据最终都会封装为此对象
 * @param <T>
 */
@Data
public class R<T> {//用了泛型增强通用性
//此三项对应登录页面时响应数据中所需要的哪几项
private String code; // 编码：成功或失败的状态码描述（如 "200"）
    private String msg;  // 错误信息或提示信息（如 "请求成功"）
    private T data;      // 数据封装为 JSON 格式

    /**
     * 成功响应方法（带状态码和消息）
     */
    public static <T> R<T> success(ResponseCodeEnum code, T object, MessageEnum msg) {
        R<T> r = new R<>();
        r.setCode(code.toString()); // 转换为描述信息
        r.setMsg(msg.getMessage()); // 获取消息内容
        r.setData(object);
        return r;
    }

    /**
     * 成功响应方法（仅带状态码）
     */
    public static <T> R<T> success(ResponseCodeEnum code) {
        R<T> r = new R<>();
        r.setCode(code.toString()); // 转换为描述信息
        return r;
    }

    /**
     * 成功响应方法（仅带数据）
     */
    public static <T> R<T> success(T object) {
        R<T> r = new R<>();
        r.setCode(ResponseCodeEnum.SUCCESS.toString()); // 默认使用 SUCCESS 的描述信息
        r.setData(object);
        return r;
    }

    /**
     * 成功响应方法（带状态码和消息）
     */
    public static <T> R<T> success(ResponseCodeEnum code, MessageEnum msg) {
        R<T> r = new R<>();
        r.setCode(code.toString()); // 转换为描述信息
        r.setMsg(msg.getMessage()); // 获取消息内容
        return r;
    }

    /**
     * 失败响应方法（带状态码和消息）
     */
    public static <T> R<T> error(ResponseCodeEnum code, MessageEnum msg) {
        R<T> r = new R<>();
        r.setCode(code.toString()); // 转换为描述信息
        r.setMsg(msg.getMessage()); // 获取消息内容
        return r;
    }

}
